FlowLayout 容器效果图如下所示:
12.3.1 XML 布局
先定义一个 style 标签,这是为 FlowLayout 中的 TextView 定义的。
/res/drawable/flag.xml
act_main.xml 的布局代码:
12.3.2 提取 margin 值与重写 onMeasure() 函数
1. 提取 margin 值
|
|
2. 重写 onMeasure() 函数
要实现 FlowLayout,必然涉及下面几个问题。
1)何时换行
从效果图中可以看到,FlowLayout 的布局是一行行的,如果当期已经放不下一个控件了,就把这个控件移到下一行显示。所以需要一个变量来计算当前行已经占据的宽度,以判断剩下的空间是否还能容得下下一个控件。
2)如何得到 FlowLayout 的宽度
FlowLayout 的宽度是所有行宽度的最大值,所以我们要记录每一行所占据的宽度值,进而找到所有值中的最大值。
3)如何得到 FlowLayout 的高度
FlowLayout 的高度是每一行高度的总和,而每一行的高度则取该行中所有控件高度的最大值。
3. 重写 onLayout() 函数——布局所有子控件
在 onLayout() 函数中需要一个个布局子控件。由于控件要后移和换行,所以我们要标记当前控件的 top 坐标和 left 坐标。然后计算每个控件的 top 坐标和 left 坐标,再调用 layout(int left, int top, int right, int bottom)。
12.3.3 完整代码
|
|